#ifndef ENHANCED_CHAT_SYSTEM_DB_H
#define ENHANCED_CHAT_SYSTEM_DB_H

#include "enhanced_chat_system.h"
#include "database_manager.h"
#include <memory>
#include <mutex>

// 支持数据库持久化的增强聊天系统
class EnhancedChatSystemDB {
private:
    // 内存缓存（用于快速访问在线用户）
    std::unordered_map<std::string, std::shared_ptr<UserInfo>> onlineUsers;
    std::unordered_map<int, std::string> socketToUser;  // socket -> userId 映射
    
    // 线程安全
    std::mutex usersMutex;
    
    // 数据库管理器（使用全局实例）
    DatabaseManager* dbManager;

public:
    EnhancedChatSystemDB();
    ~EnhancedChatSystemDB();
    
    // 初始化数据库连接
    bool initialize(const DatabaseConfig& config = DatabaseConfig{});
    void cleanup();
    
    // ==================== 用户管理 ====================
    bool addUser(const std::string& userId, int socketFd, const std::string& ip);
    void removeUser(const std::string& userId);
    std::shared_ptr<UserInfo> getUser(const std::string& userId);
    std::vector<std::shared_ptr<UserInfo>> getOnlineUsers();
    bool updateUserStatus(const std::string& userId, UserStatus status);
    void updateUserActivity(const std::string& userId);
    
    // ==================== 私聊管理 ====================
    std::string startPrivateChat(const std::string& user1, const std::string& user2);
    bool sendPrivateMessage(const std::string& fromUser, const std::string& toUser, const std::string& content);
    std::shared_ptr<PrivateChat> getPrivateChat(const std::string& user1, const std::string& user2);
    std::vector<std::string> getUserPrivateChats(const std::string& userId);
    
    // 获取私聊历史消息
    std::vector<EnhancedMessage> getPrivateMessages(const std::string& user1, const std::string& user2, 
                                                   int limit = 50, int offset = 0);
    
    // ==================== 群组管理 ====================
    std::string createGroup(const std::string& groupName, const std::string& ownerId, const std::string& description = "");
    bool joinGroup(const std::string& groupId, const std::string& userId);
    bool leaveGroup(const std::string& groupId, const std::string& userId);
    bool sendGroupMessage(const std::string& groupId, const std::string& fromUser, const std::string& content);
    bool inviteToGroup(const std::string& groupId, const std::string& inviterId, const std::string& inviteeId);
    std::shared_ptr<GroupInfo> getGroup(const std::string& groupId);
    std::vector<std::shared_ptr<GroupInfo>> getUserGroups(const std::string& userId);
    
    // 获取群组历史消息
    std::vector<EnhancedMessage> getGroupMessages(const std::string& groupId, int limit = 50, int offset = 0);
    
    // ==================== 消息路由 ====================
    void routeMessage(const EnhancedMessage& message);
    void sendToUser(const std::string& userId, const EnhancedMessage& message);
    void broadcastToGroup(const std::string& groupId, const EnhancedMessage& message, const std::string& excludeUser = "");
    
    // ==================== 工具方法 ====================
    std::string generateId();
    std::string generateChatId(const std::string& user1, const std::string& user2);
    bool isUserOnline(const std::string& userId);
    
    // ==================== 数据同步方法 ====================
    // 从数据库加载用户数据到内存缓存
    bool loadUserToCache(const std::string& userId);
    // 将在线用户状态同步到数据库
    void syncOnlineUsersToDatabase();
    // 清理离线用户缓存
    void cleanupOfflineUsers();
    
    // ==================== 统计信息 ====================
    int getUserMessageCount(const std::string& userId);
    int getGroupMessageCount(const std::string& groupId);
    std::vector<EnhancedMessage> getRecentMessages(const std::string& userId, int limit = 20);

private:
    // 内部辅助方法
    bool saveMessageToDatabase(const EnhancedMessage& message);
    void updateChatActivity(const std::string& chatId);
    std::shared_ptr<UserInfo> getUserFromCache(const std::string& userId);
    void removeUserFromCache(const std::string& userId);
};

#endif // ENHANCED_CHAT_SYSTEM_DB_H 